﻿// Autore: Mattia Barrasso

using NUnit.Framework;
using RecipesManager.Data;
using TechTalk.SpecFlow;

namespace RecipesManager.Specs.Negozio
{
    [Binding, Scope(Feature = "AggiungiNegozio")]
    class AggiungiNegozio : NegoziBDD
    {
        [BeforeScenario]
        public new void SetUpScenario()
        {
            base.SetUpScenario();
        }

        [AfterScenario]
        public new void TearDownScenario()
        {
            base.TearDownScenario();
        }

        [Given(Regex = "il negozio \"([a-zA-Z ]+)\" non esiste")]
        public void DatoNegozioNonEsistente(string negozio)
        {
            Assert.That(!Manager.Shops.Contains(negozio));
        }

        [Given(Regex = "il negozio \"([a-zA-Z ]+)\" esiste")]
        public void DatoNegozioEsistente(string negozio)
        {
            Manager.Shops.Add(negozio);
            Assert.That(Manager.Shops.Contains(negozio));
        }

        [Given(Regex = "l'ingrediente \"([a-zA-Z ]+)\" esiste")]
        public void DatoIngredienteEsistente(string ingrediente)
        {
            Manager.Ingredients.Add(ingrediente, MeasureType.Weight);
            Assert.That(Manager.Ingredients.Contains(ingrediente));
        }

        [Given(Regex = "ho inserito i valori")]
        public void DatoNegozioInserito(Table table)
        {
            NavigateToShops();
            GetShopsUi();
            NewShop.Click();
            GetSingleShopUi();
            foreach (var row in table.Rows)
            {
                if(row["Attributi"].Equals("Nome"))
                {
                    ShopName.SetValue(row["Valori"]);
                }else if(row["Attributi"].Equals("Indirizzo"))
                {
                    ShopAddress.SetValue(row["Valori"]);
                }else if(row["Attributi"].Equals("Citta"))
                {
                    ShopCity.SetValue(row["Valori"]);
                }else if(row["Attributi"].Equals("Telefono"))
                {
                    ShopTelephone.SetValue(row["Valori"]);
                }else if(row["Attributi"].Equals("Orario"))
                {
                    ShopOpeningTimes.SetValue(row["Valori"]);
                }else if(row["Attributi"].Equals("Ingrediente"))
                {
                    Assert.That(Manager.Ingredients.Contains(row["Valori"]));
//                    Assert.That(Ingredients.Items.Any(item => item.Text.Equals(row["Valori"])));
                    Ingredients.Click();
                    Ingredients.Select(row["Valori"]);
                    AddIngredient.Click();
                }
                else
                {
                    Assert.Fail("Table");
                }
            }
        }

        /*[Given(Regex = "sono consigliati gli ingredienti")]
        public void DatiIngredientiConsigliati(Table table)
        {
            foreach (var row in table.Rows)
            {
                if (!row["Attributi"].Equals("Nome"))
                {
                    Assert.Fail("Table");
                }
                var lw = (ListView)SelectedIngredients;
                int i;
                for (i = 0; i < lw.Rows.Count; i++)
                {
                    if (lw.Rows[i].GetElement(SearchCriteria.ByText(row["Valori"])) != null)
                        break;
                }
                Assert.That(i != lw.Rows.Count);
                Assert.That(lw.Rows[i].Cells[1] != null);
            }
        }*/

        [When(Regex = "salvo")]
        public void QuandoSalvo()
        {
            if(SaveShop.Enabled)
                SaveShop.Click();
        }

        [When(Regex = "ricerco \"([a-zA-Z ]+)\"")]
        public void QuandoRicerco(string negozio)
        {
            NavigateToShops();
            GetShopsUi();

            SearchedShop.SetValue(negozio);
            SearchShop.Click();
        }

        [Then(Regex = "il negozio \"([a-zA-Z ]+)\" è visualizzato")]
        public void AlloraEVisualizzato(string negozio)
        {
            Assert.That(Shops.Items.Exists(shop => shop.Text.Equals(negozio)));
        }

        [Then(Regex = "il negozio \"([a-zA-Z ]+)\" non è visualizzato")]
        public void AlloraNonEVisualizzato(string negozio)
        {
            Assert.That(!Shops.Items.Exists(shop => shop.Text.Equals(negozio)));
        }

        [Then(Regex = "l'operazione non ha successo")]
        public void AlloraOperazioneInsuccesso()
        {
            Assert.That(MainWindow.ModalWindows().Count != 0 || !SaveShop.Enabled);
        }

        [Then(Regex = "l'operazione ha successo")]
        public void AlloraOperazioneSuccesso()
        {
            Assert.That(MainWindow.ModalWindows().Count == 0);
        }

        [Then(Regex = "il negozio \"([a-zA-Z ]+)\" esiste")]
        public void AlloraNegozioEsiste(string negozio)
        {
            Assert.That(Shops.Items.Exists(item => item.Text.Equals(negozio)));
            Assert.That(Manager.Shops.Contains(negozio));
        }
    }
}
